package tankgame4;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;

//为了子弹一直重汇，做成线程
public class MyPanel extends JPanel implements KeyListener ,Runnable{

    SuperMan tank =null;
    ////敌人坦克，每个坦克在自己线程独自运行，所以用Vector（线程安全）
    Vector<Enemy> enemies = new Vector<>();

    Vector<Bomb> bombs = new Vector<Bomb>();//炸弹集合
    Image image1 = null;//三个爆炸图片效果
    Image image2 = null;
    Image image3 = null;

    int enemySize=3;

    public MyPanel(){
        tank=new SuperMan(100,100);//初始化我方坦克
        tank.setSpeed(3);

        for(int i=0;i<enemySize;i++){
            //敌人坦克初始化
            Enemy enemy = new Enemy(100 * (i + 1), 0);
            enemy.setDirect(2);
            new Thread(enemy).start();//每个敌人坦克都是线程。创建了当然要启动

            //初始化敌人坦克子弹
            Shot shot = new Shot(enemy.getX() + 20, enemy.getY() + 60, enemy.getDirect());
            enemy.shots.add(shot);
            new Thread(shot).start();//启动shot线程

            enemies.add(enemy);//敌人坦克集合
        }
    }

    @Override
    public void run() {//隔100ms，重回一次
        while (true){
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //判断是否集中坦克，动态刷新来实现
//        if(tank.shot!=null && tank.shot.isLive){//自己子弹销毁了没必要判断
//            for (int i = 0; i < enemies.size(); i++) {
//                Enemy enemy = enemies.get(i);
//                hitTank(tank.shot,enemy);    //
//            }
//        }

            //判断敌人是否击中我们
            hitSuperman();
            //判断我们发射的子弹有没有打中敌人
            hitEnemys();


        this.repaint();
        }//while

    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,1000,650);//填冲矩形，默认黑色（就是面板上全是黑色而已）

        //画我方子弹
//        if(tank.shot!=null && tank.shot.isLive==true){
//            g.draw3DRect(tank.shot.x,tank.shot.y,3,3,false);
//        }

        /*
            画我方很多的子弹
         */
        for (int i = 0; i < tank.shots.size(); i++) {
            Shot shot = tank.shots.get(i);
            if(shot!=null && shot.isLive){
            g.draw3DRect(shot.x,shot.y,3,3,false);
        }else {
                tank.shots.remove(shot);
            }
        }

        /*
        画我方坦克
         */
        if(tank.isLive && tank!=null)
        drawTank(tank.getX(),tank.getY(),g,tank.getDirect(),0);

        //画爆炸效果
        //bombs集合有,就画
        for (int i = 0; i < bombs.size(); i++) {
            Bomb bomb = bombs.get(i);
            if(bomb.life>6){
                g.drawImage(image1,bomb.x,bomb.y,60,60,this);
            }else if(bomb.life>3){
                g.drawImage(image2,bomb.x,bomb.y,60,60,this);
            }else{
                g.drawImage(image3,bomb.x,bomb.y,60,60,this);
            }
            bomb.downLife();//减少生命周期
            if(bomb.life==0)
                bombs.remove(bomb);
        }

        //画敌方坦克
        for (int i=0;i<enemies.size();i++){
            Enemy enemy = enemies.get(i);
            //先判断敌方坦克是否被击毁
            if(enemy.isLive){
            drawTank(enemy.getX(),enemy.getY(),g,enemy.getDirect(),1);//地方坦克
            //画地方坦克子弹
            for (int j = 0; j < enemy.shots.size(); j++) {
                //取子弹
                Shot shot = enemy.shots.get(j);
                //画子弹
                if(shot.isLive){
                    g.draw3DRect(shot.x,shot.y,3,3,false);
                }else {
                    //从Vectory移除
                    enemy.shots.remove(shot);
                }
            }//if
            }
        }//for

        //初始化爆炸图片
        image1=Toolkit.getDefaultToolkit().getImage(MyPanel.class.getResource("bomb_1.gif"));
        image2=Toolkit.getDefaultToolkit().getImage(MyPanel.class.getResource("bomb_2.gif"));
        image3=Toolkit.getDefaultToolkit().getImage(MyPanel.class.getResource("bomb_3.gif"));
    }//paint

    /*
    判断敌人坦克是否打到我们坦克上
     */
    public void hitSuperman(){
        //遍历敌人坦克
        for (int i = 0; i < enemies.size(); i++) {
            Enemy enemy = enemies.get(i);
            //遍历子弹
            for (int j = 0; j < enemy.shots.size(); j++) {
                Shot shot = enemy.shots.get(j);
                if(tank.isLive && shot.isLive){
                    hitTank(shot,tank);
                }
            }
        }
    }

    /*
    判断发射的子弹有没有打中敌人
     */
    public void hitEnemys(){
        //挨个看所有子弹
        for (int i = 0; i < tank.shots.size(); i++) {
            Shot shot = tank.shots.get(i);
            if(shot!=null && shot.isLive){//自己子弹销毁了没必要判断
                //遍历敌人坦克
                for (int j = 0; j < enemies.size(); j++) {
                    Enemy enemy = enemies.get(j);
                    hitTank(tank.shot,enemy);
                }
            }
        }
    }//hitEnemys()

    //判断子弹是否打到坦克上
    public  void hitTank(Shot s,Tank tank){//多态，因为这里也能传我方坦克对象
            switch (tank.getDirect()){
                case 0:
                case 1://上,又
                    if(s.x>tank.getX() && s.y<tank.getY()+40
                    && s.y>tank.getY() && s.y>tank.getY()+60){    //子弹的坐标
                        s.isLive=false;
                        tank.isLive=false;//子弹，坦克销毁

                        if(tank instanceof Enemy){
                            //击中坦克后，坦克从集合里删除，不然坦克爆炸后，子弹进入区域还会有爆炸图片
                            enemies.remove(tank);//没效果？？？？(是下面情况没写)
                        }else{
                            tank.isLive=false;//我方
                        }


                        //创建Bomb对象，加入集合中
                        Bomb bomb = new Bomb(tank.getX(), tank.getY());
                        bombs.add(bomb);
                    }
                    break;
                case 2://下
                case 3://左
                    if(s.x>tank.getX() && s.x<tank.getX()+60
                    && s.y>tank.getY() && s.y<tank.getY()+60){
                        s.isLive=false;
                        tank.isLive=false;

                        if(tank instanceof Enemy) {
                            //击中坦克后，坦克从集合里删除，不然坦克爆炸后，子弹进入区域还会有爆炸图片
                            enemies.remove(tank);//没效果？？？？(加上好了)
                        }else{
                            tank.isLive=false;//我方
                        }

                        //创建Bomb对象，加入集合中
                        Bomb bomb = new Bomb(tank.getX(), tank.getY());
                        bombs.add(bomb);
                    }
                    break;
            }//switch
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }//keyTyped

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_W){    // w键
            tank.setDirect(0);
            if (tank.getY()>0)//控制我方坦克的边界
            tank.moveUp();
//            tank.setY(tank.getY()-1);//这种做法就太low了
        }else if(e.getKeyCode()==KeyEvent.VK_S){
            tank.setDirect(2);
            if(tank.getY()+60<650)
            tank.moveDown();
        }else if(e.getKeyCode()==KeyEvent.VK_A){
            tank.setDirect(3);
            if (tank.getX()>0)
            tank.moveLeft();
        }else if(e.getKeyCode()==KeyEvent.VK_D){
            tank.setDirect(1);
            if (tank.getX()+60<1000)
            tank.moveRight();

        }
        //J键我方坦克创建子弹线程
        if(e.getKeyCode()==KeyEvent.VK_J){
            if(tank.isLive && tank!=null)
            tank.shotEnemyTank();
        }

        this.repaint();//按键后，画新图
    }//keyPressed

    @Override
    public void keyReleased(KeyEvent e) {

    }
    /**
     *
     * @param x
     * @param y
     * @param g    画笔
     * @param direct   坦克上下左右方向
     * @param type 敌方，我方坦克
     */
    public void drawTank(int x,int y,Graphics g,int direct,int type){
        switch (type){
            case 0://我方坦克
                g.setColor(Color.cyan);//青色
                break;
            case 1://敌方坦克
                g.setColor(Color.yellow);//控制所有图形的颜色
                break;
        }
        //不同方向，坦克样子都要画！麻烦哦
        //0-上  1-右  2-下 3-左
        switch (direct){
            case 0://朝上的坦克
                g.fill3DRect(x,y,10,60,false);//左边轮子
                g.fill3DRect(x+30,y,10,60,false);//右边轮子
                g.fill3DRect(x+10,y+10,20,40,false);//中间方形
                g.fillOval(x+10,y+20,20,20);//中间圆圈
                g.drawLine(x+20,y+30,x+20,y);//炮筒
                break;
            case 1://朝右的坦克
                g.fill3DRect(x,y,60,10,false);//上边轮子
                g.fill3DRect(x,y+30,60,10,false);//下边轮子
                g.fill3DRect(x+10,y+10,40,20,false);//中间方形
                g.fillOval(x+20,y+10,20,20);//中间圆圈
                g.drawLine(x+30,y+20,x+60,y+20);//炮筒
                break;
            case 2://朝下的坦克
                g.fill3DRect(x,y,10,60,false);//左边轮子
                g.fill3DRect(x+30,y,10,60,false);//右边轮子
                g.fill3DRect(x+10,y+10,20,40,false);//中间方形
                g.fillOval(x+10,y+20,20,20);//中间圆圈
                g.drawLine(x+20,y+30,x+20,y+60);//炮筒
                break;
            case 3://朝左的坦克
                g.fill3DRect(x,y,60,10,false);//上边轮子
                g.fill3DRect(x,y+30,60,10,false);//下边轮子
                g.fill3DRect(x+10,y+10,40,20,false);//中间方形
                g.fillOval(x+20,y+10,20,20);//中间圆圈
                g.drawLine(x+30,y+20,x,y+20);//炮筒
                break;
            default:
                System.out.println("其他方法还没画");
        }
    }//drawTank

}
